const winston = require('winston');
const LogsService = require('./LogService');
// 直接引入 WinstonTransport
const WinstonTransport = require('winston-transport');

// 自定义数据库传输层（只处理 info 及以上级别）
class DatabaseTransport extends WinstonTransport {
  constructor(options = {}) {
    super(options);
    this.level = options.level || 'info';
  }

  log(data, callback) {
    setImmediate(() => {
      try {
        LogsService.create({
          app: 'mspace',
          level: data.level,
          message: data.message,
          metadata: data.metadata
        });
        callback();
      } catch (err) {
        console.error('日志写入数据库失败:', err);
        callback();
      }
    });
  }
}

// 配置主日志器（metadata 转换为 JSON 字符串，无颜色）
const logger = winston.createLogger({
  level: 'info',
  format: winston.format.combine(
    winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss.SSS' }),
    winston.format.printf(({ timestamp, level, message, metadata }) => {
      // 将 metadata 转换为 JSON 字符串（处理 undefined 情况）
      const metadataStr = metadata ? JSON.stringify(metadata) : '';
      return `${timestamp} [${level.toUpperCase()}] ${message} : ${metadataStr}`;
    }),
  ),
  transports: [new winston.transports.Console({}), new DatabaseTransport({ level: 'info' })],
});

module.exports = logger;
